B08【路由基础】静态路由、RIP协议
路由概述
本文将介绍路由相关知识,也就是路由器相关的内容。(假定你已经熟悉了ip地址、子网掩码、ARP等基础知识)
上篇介绍的交换与vlan都是二层技术,基于mac地址信息所在的数据帧。
而路由是三层技术(网络层),是基于ip地址信息所在的数据包。
什么是路由
在科普篇我们知道了网段的概念,同一网段内的设备之间可以使用ip地址直接互联。
而不同网段之间的设备如果也要互联,就需要借助网关。
网关会根据数据包内的ip地址信息,转发数据包到另一个网段,这个过程就是路由。
路由是数据通信网络中最基本的要素。路由信息就是指导数据包发送的路径信息,路由的过程就是数据包转发的过程。
交换是基于mac地址进行转发,路由是基于ip地址进行转发。本质都是根据目的地址转发数据报文到目标所在位置的过程。
接下来会以直连路由——静态路由——动态路由的大框架开始讲解。其他的不是不讲,而是都会包括在里面。
其中,动态路由本文只讲RIP协议,其他的碍于篇幅,留作之后另开一文单独讲解。
路由设备的接口ip
在讲路由之前还需要补充一个知识点。路由设备的接口是三层接口,可以配置ip地址。
与我们日常接触的一个设备只有一个ip地址不同,路由设备的ip地址是基于接口的,是一个接口一个ip地址。
实际平时接触的设备也可以配置多个ip地址,只是一般不这么做。
跟之前介绍交换机vlan接口时一样,请记住不要讲路由设备当作一个整体,通信都是基于接口的。
就像交换机不同接口可以连接不同vlan一样,路由设备的不同接口也可以处于不同的网段。(拥有不同的ip地址)
我们平时家里接触到的家庭路由器是集成了路由器加交换机加无线AP的设备。
其路由部分就是一个wan口加一个看不见的接口;这个接口连接了交换部分,再成为我们看到的lan口。
路由表
直接叫路由器吧,前面说路由设备是因为不止路由器有路由功能。
比如之前说的三层交换机,再比如硬件防火墙,甚至我们的电脑本身也具备路由功能。
这边为了方便,本文后面篇幅都直接叫路由器了。
路由表就是路由器内部维护的转发表,与交换机内部的交换转发表类似,都是用来指定数据报文的转发路径。
交换表是查找目标mac地址在哪个接口,而路由表是查看前往某网段需要经过哪个ip/接口。
在计算机网络中,我们常把这路由表指定的下一个通信方向叫做“出接口”或“下一跳”。
但其实它们具体意义并不一样,出接口特指本路由器的接口(从该接口转发出去),下一跳特指下一台路由器(以ip地址为标识)
当一台路由器收到一个IP报文时,它会在自己的路由表中执行路由查询,寻找匹配该报文的路由条目。
- 如果找到了匹配的路由条目,则路由器会按照该条目所指示的出接口/下一跳地址转发该报文;
- 如果没有找到匹配的路由条目,则表示路由器没有可用于指导报文转发的信息,无法转发报文,因此该报文会被丢弃。
我们的电脑内部当然也有路由表,Windows里使用命令route print就可以查看路由表。
下面摘抄几条:
1 | IPv4 路由表 |
能看出第一列是网络号,第二列是子网掩码。(第三列的“在链路上”指不需要经过网关,同网段)
但我们能发现有几个特殊的地方,网络号0.0.0.0与子网掩码255.255.255.255?
缺省路由与主机路由
0.0.0.0一般用来配置缺省路由所使用的地址,这个地址表示任意ip地址。
缺省路由,也就是默认的路由。
在路由表中找不到的网段,就会走0.0.0.0这一条默认路由。
我电脑设置的网关是172.25.167.254,所以就有这一条信息。这样不管我的电脑访问什么外网的ip地址,都会通过网关去访问。
如果没了这一条缺省路由,我们就会发现电脑无法连上”外网“,因为电脑查不到路由,数据包不知道发给谁。
掩码255.255.255.255,这是指全匹配,也就是说这一行的第一列不是网络号,而是一个完全的ip地址。这一条路由是主机路由。
那么什么是匹配呢?
最长匹配原则
路由器收到一个数据包,查找路由表时,会拿着ip地址与路由表中的网段进行逐一匹配。
在这个过程中,会匹配掩码最长的、最准确的一条路由信息。
为了形象一点,把子网掩码转成前缀的书写方式,路由会匹配数字最大的那一条。

形象比喻一下,就是:
广东省广州市OO区××街道%%巷##号
广东省广州市OO区××街道
广东省广州市
广东省
要找我,那最好就是按第一条信息来找最为精准。
以前面那张我电脑的路由表来说:
1 | IPv4 路由表 |
如果访问172.25.167.25这个ip地址,电脑查找路由表就会匹配第三条路由(172.25.167.25/32)。
如果访问172.25.167.20这个ip地址,电脑查找路由表就会匹配第二条路由(172.25.164.0/22)。
如果访问172.25.1.20这个ip地址,电脑查找路由表就会匹配第一条路由(0.0.0.0/0)。
优先级与度量值
如果存在多条路由信息,且掩码长度一样,无法依靠最长匹配原则分出孰优孰劣。则会比较优先级与度量值。
优先级是按路由类型划分的,常见的见下表:
当路由类型一致,则会比较度量值,所谓度量值,也可以称为开销(cost),是到达目标网段的消耗度、代价值。
实际上,叫做度量值更为准确,因为个别路由类型并不是使用cost作为参考值,例如后面会介绍的RIP协议是采用跳数(hop)作为参考值。
路由匹配机制
总结一下,当路由器收到一个待转发的数据包时,它会去查找路由表,如果路由表没有该数据包目的地址所在的信息,则会丢弃。
如果有相应的路由条目,则按照最长匹配原则转发。
当最长匹配原无法筛出唯一的路由条目,则再按照优先级比较(越小越优先)
若还无法确定,则按度量值进行匹配(也是越小越优先)
万一还是无法确定,则确定为等价路由,随机走其中一条路由。
直连路由
直连路由非常的简单,当你给路由器的接口配置了ip地址,那它就会自动生成一条直连路由的信息。
因为配置ip地址,也就是指明了该接口所处的网段,那么对路由器来说,收到前往该网段的路由的出接口就是经过该接口。
对于直连路由来说,由于设定是接口就处于该网段,也就是说数据包无需传递给下一台路由器,数据包的下一个接收对象就是接收方了(忽略掉不感知IP地址的二层交换机)。因此路由器转发该数据包的时候,会直接使用ARP广播查找目标主机,获取到目标主机的回应后,直接将数据包发送给目标主机。
在ensp上开一台路由器试试
使用dis ip routing-table 可以查看路由表信息,默认只有本地地址的信息(127.0.0.0网段的)
进入接口int g0/0/0,使用ip address 10.1.1.1 8 添加一个IP地址(子网前缀为8)
这时再查看一次路由表,会发现。。什么新东西都没有。
不急,这是因为该接口未被启用,使用dis int brief 查看接口状态,就能看到接口都是“down”。
再添加一台路由器,用线缆连接路由器的0号口,再查看接口状态就是“up”了
1 | [magiku]dis int brief |
这时再去查看路由表,就能发现出现3条10网段的路由信息了。(网段路由,主机路由与广播路由)
同时可以看到“Proto”一列标注为“Direct”,意为直接的。
插播一条知识点,“Flags”一列的“D”,意为download,是指下载到了转发表。是的,除了路由表,还有转发表。
路由器实际工作时是以转发表为准,路由器将路由表内的路由信息进行简单处理加载进电路中的转发表,方便进行高速转发,减少中间迭代路由的操作,这有点类似于CPU的cache。
但因为一般没有什么区别,也为了方便,还是统一描述为“路由器根据路由表进行转发”。
1 | [magiku]dis ip routing-table |
注意,我第二台路由器未做任何配置,但这还是有直连路由出现。
现在我们把第二台路由器配置一下ip
int g0/0/0
ip add 10.1.1.2 8
这两台路由器就可以互相访问了。
我们再在路由器1底下连接一个PC,IP设置为192.168.1.2 /24 。路由器对应接口配置为192.168.1.1/24。
现在路由器1与pc之间也能互相访问。

可以看到AR1ping的通AR2,也ping的通PC1;问题来了,PC与AR2互通吗?
PC访问10.1.1.2,检测不是同网段,会发包给AR1;而AR1有到AR2的直连路由,那应该ok?
但很遗憾,不行
1 | PC>ping 10.1.1.2 |
原因很简单,AR2没有到PC所在的192.168.1.0网段的路由信息,也没有默认路由去AR1。(没有路由就无法转发,无法转发也就会丢弃报文)
PC可以发包给AR2,AR2不能回包给PC。
1 | [AR2]dis ip rout |
为此我们就需要手动配置一条路由信息进去。
静态路由
手动配置的路由就是静态路由。
上面那个拓扑中,想让AR2访问PC,就需要配置到达192.168.1.0的静态路由。
ip route-static 192.168.1.0 24 10.1.1.1
后面的参数分别是网段、子网掩码、路由地址(下一跳)。
在AR2中配置完该命令后,AR2与PC就能相互通信了。
实际上,该命令可以指定出接口,但并不推荐。因为指定出接口的话,会被路由器当成该网段就处于指定的接口下(直连),因而转发数据包的时候,会直接采用ARP查找主机,再直接发送给主机。
静态路由的使用案例
假设一台电脑同时连接了有线网络与无线WiFi网络,而在这两个网络中分别有一台服务器。
如果优先使用有线网络,就无法访问无线网络中的服务器,反之亦然。
Windows中的路由优先级的设置就是高级设置中的跃点数
1 | IPv4 路由表 |
目前我在笔记本上连接了无线网络(192.168.31.0/24)与有线网络(192.168.197.0/24),且已修改为WiFi优先。
我在有线网络上配置了一台共享服务器10.249.203.64。
测试一下到达服务器的路径与连通性:
1 | PS C:\Users\magiku> tracert 10.249.203.64 |
是走的无线网络,而且可以看到无法访问。
接下来就配置一条静态路由(Windows的配置命令与华为VRP的命令不一样,但还是那么个理)
ip10.249.203.64,掩码255.255.255.255的目的地址 就从有线网络192.168.197.178路由出去
1 | PS C:\Users\magiku> route add 10.249.203.64 mask 255.255.255.255 192.168.197.178 |
上浏览器实测,也确实可以正常访问服务器。

浮动路由

以这个拓扑为例子,存在3个网段,假设ip地址都配置好了。
那么我们需要在R1与R4上各补充两条路由才能保证R1到R4网络互通。
1 | [R1]ip route-static 192.168.1.0 24 10.0.12.2 |
1 | [R4]ip route-static 10.0.12.0 24 192.168.1.2 |
事实也如此。

1 | [R1]display ip routing-table |
我们把焦点落到这条路由条目上,对于前往R4所在的192.168.1.0/24网段,有两个下一跳与出接口,这就是等价路由。
192.168.1.0/24 Static 60 0 RD 10.0.12.2 GigabitEthernet0/0/0
Static 60 0 RD 10.0.13.3 GigabitEthernet0/0/1
因为我们配置的都是静态路由,且都没做任何其他修改。等价路由的好处就是可以实现负载分担,让流量能分摊到两条链路中。
但有时我们希望流量只走一条链路,另一条链路作为备用的,当主链路故障时,再自动切换到备用链路。
这很好理解,就是设置优先级,就像我们前面修改Windows系统中网络的跃点数,让WiFi优先于有线网络一样。
我们也可以手动设置静态路由的优先级。
1 | [R1]ip route-static 192.168.1.0 24 10.0.12.2 preference 10 |
接下来再看一次R1的路由表:
1 | [R1]display ip routing-table |
我们可以看到只剩下刚刚修改了优先级的那一条,另外一条不见了。但其实那条路由还存在数据库里,是“潜藏”起来了。
而当该链路故障时(这边直接使用关闭接口的命令模拟),该静态路由就会失效。而另一条路由则“浮现”出来了。
因为这种现象,虽然仅仅只是对静态路由修改了优先级,但这种配置方式叫做“浮动路由”。
1 | [R1]interface g0/0/0 |
实际上,在R2与R3上最好要配上到达R1的另一个网段的静态路由。不然可能出现以下现象:
假设交换机SW1底下连接一台PC,网关设置为R3。
当使用R1去ping PC,当前路由优先级让R1到达192.168.1.0/24网段走R1-R2的链路,PC就处于R2的直连路由底下,因此从R1到PC的去程是通的;
而返程的时候,因为去程是走的R1-R2的链路,报文中的源ip地址也就是10.0.12.1,PC回包的时候,填写的目的也就是该地址,且由于与该ip地址处于不同网段,PC会将该回包发给它的网关R3,但R3并没有到达10.0.0.12.1的路由,因此该回程报文会在此被丢弃。
最终,R1 ping不通PC。
而当使用PC去ping R1的时候,如果使用的是R1的10.0.13.1的ip地址,那么PC是能ping通R1的。
”不浮动的浮动路由“
其实以上需求除了配置浮动路由之外,还有另外一个方式,那就是修改路由的目标网段子网掩码大小,本质还是让等价路由不再等价。
当然,行业里没有”不浮动的浮动路由“这个叫法,是我的比喻。
1 | [R1]ip route-static 192.168.1.0 24 10.0.12.2 |
这样的话,同时加载/23与/24的路由,根据最长匹配原则,就会优先走/24的主链路。
同样的,当主链路故障后,主链路的路由失效,就会匹配到/23的路由,从而走备用链路转发报文。
1 | [R1]interface g0/0/0 |
汇总路由与黑洞路由

我们修改一下拓扑到现在这个状态,R1直连互联网,作为出口路由器。因此配置了默认路由(缺省路由)指向外网。
则R2与R3也需要配置指向R1的默认路由。
在此基础上,R2底下连有3个网段,R3底下连有4个网段。
则我们需要在R1上配置如下静态路由:
1 | [R1]ip route-static 192.168.1.0 24 10.0.12.2 |
在R2与R3也需要配置相应的路由,这就很繁琐了。
而仔细观察我们的网络规划,可以发现网段都是连续的,这就可以通过“反向子网划分”,扩大网段的方式把多条路由信息聚合成单条路由。
比如R1的配置就可以修改为
1 | [R1]ip route-static 192.168.0.0 22 10.0.12.2 |
这种方式称为汇总路由/聚合路由/路由汇总(总之这个意思的叫法都行)
黑洞路由
但是就当前拓扑来说,这个方案存在一点缺陷:192.168.0.0 /22这个大网段中包含了192.168.0.0–192.168.0.255这一段ip地址,而原本的拓扑中,R2并不拥有该段地址。
如果这一段地址,该区域其他路由器有在使用,我们还可以配置192.168.0.0/24的静态路由,依靠最长匹配原则让数据报能走到正确的位置。
但如果该区域内就是没有使用这段ip,一般情况下没有问题,但这是一个潜在的安全隐患。
假设网络中突然存在送达给192.168.0.233的数据包,该数据包会被路由到R2。
但是R2检查自己的路由表,匹配不到192.168.0.0/24的路由,且因为之前配置了0.0.0.0的默认路由指向R1。则数据包会按默认路由的方向转发给R1。
对于R1来说,它又会继续按照192.168.0.0/22的路由转发回R2。
这个数据包就此在R1与R2之间来回循环,知道数据包内TTL值归0.
这个漏洞如果被蓄意攻击者发现,则会导致网络资源被大量消耗。
要解决这个问题,可以为该网段配置静态路由,出接口设置为null 0。意为直接丢弃该数据包。
这酷似黑洞,不管来多少数据包,通通都会消失,因此这种配置方式叫做黑洞路由。
1 | [R1]ip route-static 192.168.0.0 24 NULL 0 |
静态路由的改善
静态路由一般用于小型网络,因为其不具备灵活变动的特性,遇上网络变动/故障,就会导致通信失效。
上面介绍浮动路由那里看起来似乎是带有灵活变动的特性啊?
这个是因为静态路由需要使用出接口,而当出接口的状态为“dowm”时,使用到该出接口的路由也就失效了。
但是很多时候,路由器检测到的直连链路状态是否正常不意味着,路由是否正常。
比如说路由器A——交换机S——路由器B,这样的连接模式,路由器A只能检测它到交换机S的链路状态,如果故障出在交换机S到路由器B之间,那么路由器A是无法感知的。
取前面浮动路由的拓扑,我们调皮一下,R1与R2之间加一台交换机,然后不连接交换机到R2的链路。
可以看到,R1对于到达R2的直连路由和经过R2的静态路由都没有删除,依旧保留着。
这种情况下,即便配备了浮动路由,由于检测不到网络变动,也达不到主备切换。
虽然有备用链路,但还是造成了局部断网的现象。
为此,有两种解决方法,一是采用动态路由,二是为静态路由绑定BFD。
第一种是我们的重点学习内容,之后会专门介绍;
第二种是让静态路由绑定检测工具,检测到网络故障,就删除静态路由;网络恢复就恢复静态路由。
NQA也可以实现BFD对于静态路由的增删功能,但BFD的检测速度更快,且一般支持BFD协议的设备更多。
BFD的介绍与简单配置
双向转发检测BFD(Bidirectional Forwarding Detection)是一种快速检测链路或节点故障的协议;
通常用于路由器、交换机等网络设备之间进行链路状态检测。
由于 BFD 能够提供快速的故障检测和快速的路由切换,因此在网络设备中得到了广泛的支持。
BFD在两台网络设备上建立会话,用来检测网络设备间的双向转发路径,为上层应用服务。
BFD本身并没有邻居发现机制,而是靠被服务的上层应用通知其邻居信息以建立会话。
会话建立后会周期性地快速发送BFD报文,如果在检测时间内没有收到BFD报文则认为该双向转发路径发生了故障,通知被服务的上层应用进行相应的处理。
简单的配置命令为
- bfd //开启bfd功能
- bfd session-name bind peer-ip ip-address interface interface-type interface-number //创建BFD会话的绑定信息,自定义参数分别为自定义会话名称、对端设备接口ip、本端设备的出接口。
- discriminator local discr-value //配置BFD会话的本地标识符。
- discriminator remote discr-value //配置BFD会话的远端标识符。
- commit //提交配置
会话名称完全自定义,两端不需要名称相同。但标识符就需要彼此对应。
以下一小节的拓扑为例
1 | <AR1>system-view |
1 | <AR2>system-view |
标识符是一一对应的,AR1的本地标识符就是AR2上的对端标识符。
配置后,执行命令display bfd session all,检查BFD会话是否建立:
1 | [AR1]display bfd session all |
1 | [AR2]display bfd session all |
单臂回声BFD
如果链路两端的路由器只有一端支持BFD功能,那么就可以配置为单臂回声BFD(华为ensp模拟器中不支持该功能)。
操作步骤
执行命令bfd //开启bfd功能
执行命令bfd session-name bind peer-ip peer-ip interface interface-type interface-number one-arm-echo //创建单臂回声功能的BFD会话。自定义参数分别为自定义会话名称、对端设备接口ip、本端设备的出接口。
执行命令discriminator local discr-value // 配置单臂回声功能的BFD会话的标识符。
由于只能在支持BFD功能的一端设备上配置单臂回声功能,所以,配置单臂回声功能的BFD会话时,只需要配置本地标识符,无需配置远端标识符。
执行命令commit //提交配置。
但单臂回声BFD因为只能用在一端设备,所以对于解决静态路由灵活性的帮助不大。这边就当简单了解一下吧。
静态路由绑定BFD
ip route-static ip-address mask nexthop-address track bfd-session bfd-name ,为IPv4静态路由绑定静态BFD会话。
1 | [AR1]ip route-static 192.168.2.0 24 10.1.1.2 track bfd-session magiku |
1 | [AR2]ip route-static 192.168.1.0 24 10.1.1.1 track bfd-session magiku030 |
配置完毕后,网络通信正常。至于链路故障后,路由是否删除;链路恢复后,路由是否也恢复;碍于篇幅在此就不作测试了。
实际作用
你也许会在想,设置这个联动有什么用,链路都故障了,路由删不删不是还一样通不了。(如果不是等价路由的情境下)
那是因为我们是用的两台路由器做讲解,如果加入第三台路由器,情况会如何呢。
AR1与AR2都配置一条192.168.0.0 /16的路由指向AR3。
AR3中配置到达192.168.1.0 /24 与 192.168.2.0 /24的路由信息。
当AR1到AR2的链路正常时,根据最长匹配原则,优先匹配/24的路由,走该链路。
当链路AR1-AR2故障后:
如果没有配置BFD,依旧匹配AR1-AR2的路径,则网络不可达。
如果配置了BFD,AR1与AR2都匹配/16的路由走AR1-AR3-AR2的路径,网络通信正常。
动态路由
动态路由相对于静态路由来说,配置简单且具备动态自动增删路由的功能。
目前常用的动态路由有RIP、OSPF、IS-IS、BGP。
RIP是过时的技术,但实际现网中还在使用,主要用于小型网络。
OSPF则覆盖小中大型网络,用于淘汰RIP的新技术。
IS-IS与BGP用于大型、骨干型网络,一般公司几乎接触不到,多用在运营商网络中。
一般来说,学习重点在OSPF。
实际能接触到的,还是静态路由比较多(笑
距离矢量路由协议与链路状态路由协议
动态路由按大类型,分为以下两种。
距离矢量路由
矢量一词在物理学上的释义:既有大小又有方向的量。
所谓的距离矢量路由便是以距离长度与方向为参考计算的动态路由协议。
长度是指到达目标网络的度量值,而方向指的是到达该目标网络的下一跳。
距离矢量路由比喻起来就是在街上问路,好心人告诉你往哪个方向再走多久就能到达。
你把这句话记录下来,这就是动态路由信息。
本文后续介绍的RIP协议便是距离矢量路由协议
链路状态路由
链路状态路由协议则是使用一些特殊的信息描述网络的拓扑结构与网段信息,这些信息称为链路状态信息(Link State)。
这些信息会被存放于链路状态数据库(Link State Database)中,之后路由器会基于LSDB去计算出一个以自己为根的无环的最短路径树,并根据该树状网络得到路由信息。(可以说是于STP很相近的一种思路)
链路状态路由比喻起来就是收集了几个景点的周边地图与公交地铁路线图,之后计算规划出了最省时间,路程最少的旅游攻略。
去每个景点的过程路线便是动态路由信息。
链路状态路由协议的代表就是OSPF,后续单独介绍。
动态路由协议还有其他的分类方式,但我认为那并不重要,就不展开介绍了。
本文先介绍RIP,其他的路由协议比较复杂,适合一个一个出文章细细道来。
RIP协议
RIP、Routing Information Protocol(路由信息协议)是一种较为简单的内部网关协议(IGP、Interior Gateway Protocol)。
RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量来衡量到达目的网络的距离。
RIP通过端口号520的UDP报文进行路由信息的交换。
RIP诞生于 1988 年;在1993 年时,RIP 的版本升级到v2,增加了一些功能和改进,如支持无类别域间路由(CIDR)、VLSM(可变长度子网掩码)等。
本文不会花时间专门讲v1版本与v2版本的区别,都半截入土的技术了。
用起来也是直接用v2版本,因此直接默认使用v2来讲解。
基本原理
RIP协议的核心在于跳数,设备直连时,则前往该网段的跳数为0,不需要经过其他路由设备。
前往目标网段需一台设备中继,则跳数为1。
以此类推,直到跳数为16,16表示不可达,为上限值。也是因此,RIP协议不可用于大型网络。
这便是距离矢量中的长度向量。
RIP协议的次核心的接口(包含接口的ip),当设备开启RIP协议时,实际设备并不会发送去接收RIP报文,需要为RIP进程配置启用RIP的接口。
业内习惯称为”宣告网段”,但实际是宣告启用的接口,符合“宣告的网段”内的ip地址的接口就会被加入RIP进程。
当接口加入RIP进程,自然其直连路由也就纳入了RIP路由表。(直连路由跳数写为0)
设备便会向所有运行RIP进程的接口去发送RIP路由报文。(发送时将直连路由跳数写为1)
当设备从某一接口收到了附近邻居发来的RIP路由报文,便会记录在自身的数据库中,未来匹配到路由时也就能从该接口转发出去。(将对方写跳数1的路由直接加入表中)
也就是发送RIP报文时,先将跳数+1再发布出去。而接收者,接收到路由信息则无需处理,直接纳入路由表中。
当设备收到数据包,需要进行路由转发时,先匹配网段再匹配跳数,走跳数低的路径。
这是碍于该协议诞生时的环境导致的逻辑——跳数低的路径则意味着距离近,能更快的传递消息。
但到了现在,链路的带宽速率已经有了很大的差别,可能会出现跳数低的路径都是百兆的链路,而跳数多的链路都是千兆及以上的链路。
RIP路由表的生成过程
RIP启动时的初始路由表仅包含本设备的一些直连接口路由。通过相邻设备互相学习路由表项,才能实现各网段路由互通。
- RIP协议启动之后,RouterA会向相邻的路由器广播一个Request报文请求周边邻居的RIP路由表。同时也会发送一个Response报文发布自己持有的路由。
- 当RouterB从接口接收到RouterA发送的Request报文后,把自己的RIP路由表封装在Response报文内,然后向该接口发送。
- RouterA根据RouterB发送的Response报文,形成自己的路由表。
RIP的更新与维护
RIP定时器
RIP协议在更新和维护路由信息时主要使用四个定时器:
- 更新定时器(Update timer):默认30秒,当此定时器超时时,立即发送更新报文。
- 老化定时器(Age timer):默认180秒,RIP设备如果在老化时间内没有收到邻居发来的路由更新报文,则认为该路由不可达,停用该路由。从路由表中删除,但还保留在数据库中,一方面是为了方便收到更新时能快速启用该路由,另一方面是会在发布的更新报文继续发布该路由,但度量值设定为16,以通告给周边路由器,自己持有的该路由失效了。
- 垃圾收集定时器(Garbage-collect timer):默认120秒,当路由被标记为不可达,从路由表中删除时,就会启用该计时器。如果在垃圾收集时间内不可达路由没有收到来自同一邻居的更新,则该路由将被从本设备RIP中彻底删除。
- 抑制定时器(Suppress timer):当RIP设备收到对端的路由更新,其度量值为16时,对应路由进入抑制状态,并启动抑制定时器。为了防止路由震荡,在抑制定时器超时之前,即使再收到对端路由cost小于16的更新,也不接受。当抑制定时器超时后,就重新允许接受对端发送的路由更新报文。
注:RIP协议定期更新的路由报文一般都是发送设备一整张RIP路由表,默认不作个性化区分,一律发送完整路由表。
RIP路由与定时器之间的关系:
RIP的路由信息发布是由更新定时器控制的,默认为每30秒发送一次。(或者是接收到邻居的request请求报文)
每一条路由表项对应两个定时器:老化定时器和垃圾收集定时器。
当学到一条路由并添加到RIP路由表中时,老化定时器启动。
如果老化定时器超时,设备仍没有收到邻居发来的更新报文,则在RIP数据库中把该路由的度量值置为16(表示路由不可达,路由表中删除),并启动垃圾收集定时器;同时设备对外发送不可达路由更新请求报文。
如果垃圾收集定时器超时,设备仍然没有收到更新报文,则在RIP数据库中删除该路由。
简单来说:
更新定时器用于控制设备的RIP报文发布的周期。
老化定时器用于标记接收到路由信息是否可用,垃圾收集定时器用于清理不可用的路由。
触发更新
由于RIP路由信息的发布由更新定时器控制,所以当设备有路由信息更新了,也需要等更新定时器到点后才会向周边邻居发布。
是的,这跟STP很像,链路故障后,收敛速度慢,每两台设备之间需要最多30s才更新实时的网络拓扑状态。
至于为什么要设定更新定时器这个机制,则是因为RIP协议发布路由信息是将RIP的整张路由表发送出去。
如果周期设置的短,大量数据的来回传播会占用大部分网络资源。
这个问题在后来的RIP v2中得到了改善:引入了触发更新机制。
触发更新是指当路由信息发生变化时,立即向邻居设备发送触发更新报文,而不用等待更新定时器超时,从而避免产生路由环路。
路由环路是什么呢,下面就介绍以下RIP协议中可能出现的环路现象。
RIP的防环机制
RIP协议是基于距离矢量的路由协议,它并不会去检查与记录路由信息的来源与确定性,这就导致会出现路由环路的可能。
假设AR1与AR2相连且开启了RIP协议,AR1下有一直连网段192.168.1.0/24,AR1会通过RIP传递该网段路由信息给周边设备(包含了AR2)。
AR2接收的报文,了解了到达192.168.1.0/24网段的跳数为1,记录进表中。
之后AR2定时发送更新报文,就会发送能到达192.168.1.0/24但跳数为2的路由信息。
以下便是我在模拟器,抓包到的内容:


如果没有开启触发更新特性,当AR1到192.168.1.0/24的直连链路故障后,AR1失去了跳数为0的直连路由。
AR1需要等到30s的更新周期到达后,就会向周围邻居告知,他拥有的路由失效了(发布时,跳数写为16)
对AR2来说,在没收到AR1的更新报文前,它不知道AR1的直连路由断了,因此它依旧会发送可到达192.168.1.0./24跳数为2的路由。
当AR2的更新报文来的比AR1快的时候,AR1收到新的含有能到达192.168.1.0/24网段的路由,便会启用该跳数为2的通过AR2转发的路由。
此时AR2会按照它表里的到达192.168.1.0/24跳数为1的走AR1的路由,将数据包转给AR1。而AR1按照它表里的到达192.168.1.0/24跳数为2的走AR2的路由再把数据包转给AR2。
这就导致数据包会在AR1与AR2之间循环。
不过这种路由环路不会无期限的存在,每个30s周期,他们之间互相更新RIP报文,都会将跳数依次累加上去,直到16跳,被视为不可达。
没错,设定最大跳数为16,其实也是一钟防环机制,与ipv4中的TTL字段异曲同工。
RIP的路由环路,简单来说就是设备两两之间会重复对方之前发来的路由信息。为此便诞生两个治本的防环机制。
水平分割
水平分割(Split Horizon)的原理是,RIP从某个接口学到的路由,不会从该接口再发回给邻居路由器。
这样不但减少了带宽消耗,还可以防止路由环路。
操作步骤:
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number,进入接口视图。
- 执行命令rip split-horizon,启动水平分割。
毒性反转
毒性反转(Poison Reverse)的原理是,RIP从某个接口学到路由后,从原接口发回邻居路由器,并将该路由的开销设置为16(即指明该路由不可达)。利用这种方式,可以快速清除对方路由表中的无用路由。
操作步骤
- 执行命令system-view,进入系统视图。
- 执行命令interface interface-type interface-number,进入接口视图。
- 执行命令rip poison-reverse,启动毒性反转。
Tips
因为毒性反转逻辑上优于水平分割,所以即便同时配置了水平分割与毒性反转,设备也只启用毒性反转功能。
其实更治本的方案就是触发更新,所以该机制默认都会启动。(但如果专门问起RIP的防环机制是什么,对方想听到的是水平分割与毒性反转)
报文类型及格式
RIP协议的报文采用UDP封装,报文的源端口与目的端口都是520,目的IP地址为224.0.0.9,这是一个组播地址。只有侦听该组播地址的设备在接收到该数据报文时会对其进行处理,其他设备则丢弃该报文。(本文默认只讲解RIPv2)
使用组播地址的好处就是非RIP设备无需对数据报文进行解封装看到数据内容才知道是自己不需要的,这能节约这些设备的处理资源。
RIPv2的报文格式:
命令字段(Command):该字段用于标识 RIP 报文的类型。
值为1时该报文为Request报文,用于向直连路由器请求全部或部分路由信息。
值为2时该报文为Response报文,用于发送路由。该报文可以作为对Request报文的回应,也可以是路由器自主发送的,例如周期性发送路由更新或者触发性发送路由更新。 一个Response报文中最多可携带25个路由条目,当待发送的路由数量大于该值时,需使用多个Response报文。
版本字段(Version):在RIPv1中,该字段的值为2。
地址族标识符(Address Family Identifier, AFI):该字段值为2时表示IP协议。
- 如果该报文为Request报文并且是用于向直连路由器请求其整张路由表,则该字段值被设置为0,同时这个Request报文中包含且只包含一个路由条目,该路由的目的网络地址为 0.0.0.0,度量值为 16。(另外,这个报文的TTL值设定为1,这是为了实现只发送给直连路由器。)
路由标记(Route Tag):用于为路由设置标记信息,缺省为0。当一条外部路由被引入 RIP 从而形成一条 RIP 路由时,RIP 可以为该路由设置路由标记,当这条路由在整个 RIP 域内传播时,路由标记不会丢失。(需要人为进行配置,标记其实就是为路由起个名称)
IP 地址(IP Address):路由的目的网络地址。
网络掩码(Netmask):RIPv2定义了该字段用于存储路由条目的目的网络掩码,如此一来, RIPv2便能够支持VLSM(Variable Length Subnet Mask,可变长子网掩码)。
下一跳(Next Hop): RIPv2 定义了该字段,使得路由器在多路访问网络上可以避免次优路径现象。一般情况下,在路由器所发送的路由更新中,路由条目的“下一跳”字段会被设置为0.0.0.0,此时收到该路由的路由器将路由条目加载到路由表时,将路由的更新源视为到达目的网段的下一跳。在某些特殊的场景下,该字段值会被设置为非0.0.0.0,本章将在“下一跳字段”一节中介绍该字段。
度量值(Metric):该路由的度量值。(也就是跳数)
基本配置
操作步骤:
- 执行命令system-view,进入系统视图。
- 执行命令rip [ process-id ],创建RIP进程并进入RIP视图。(若不指定id,默认为进程1)
- 执行命令version 2,设置RIP版本为RIP-2。
- 执行命令network ip-address,宣告启用RIP的网段接口。
第四步需要按传统A、B、C类地址划分的规则去填写网络地址,且不需要填写掩码
A类网络的IP地址范围是1.0.0.0到126.0.0.0,默认子网掩码是255.0.0.0。
B类网络的IP地址范围是128.0.0.0到191.255.0.0,默认子网掩码是255.255.0.0。
C类网络的IP地址范围是192.0.0.0到223.255.255.0,默认子网掩码是255.255.255.0。
实际上就是看点分十进制下第一位数字的大小确定属于哪一类。
切记,该命令并不是宣布网段路由,而是通知符合该网段的接口开启RIP功能,然后发布这些接口的直连路由。
比如对于一台拥有10.1.1.0/24网段的设备,输入命令时,必须写成network 10.0.0.0
但实际不会生成发布10.0.0.0/8的路由,而是发布已存在的10.1.1.0/24的直连路由。
路由引入
将本路由器上的其他路由信息添加进相应的RIP进程的RIP路由表中,用于在发送RIP更新报文时,将这些路由发送给RIP邻居。
执行命令system-view,进入系统视图。
执行命令rip process-id ,进入RIP视图。
(可选)执行命令default-cost cost,设定引入路由的缺省度量值。如果在引入路由时没有指定度量值,则使用缺省度量值。
以下命令按需求进行执行。
执行命令import-route { static | direct | unr } ,引入静态/直连/用户路由;
执行命令import-route { rip | ospf | isis } process-id ,引入动态路由协议指定进程号内的路由信息;
执行命令import-route bgp [ permit-ibgp ] 引入BGP协议的路由信息;
(可选)执行命令filter-policy { acl-number | acl-name acl-name | ip-prefix ip-prefix-name } export [ protocol [ process-id ] | interface-type interface-number ],对引入的路由信息向外发布时进行过滤。
由于RIP要发布的路由信息中,有可能是引入的其他路由协议的路由信息,所以可通过指定protocol参数来对这些特定的路由信息进行过滤。如果没有指定protocol参数,则对所有要发布的路由信息进行过滤,包括引入的路由和本地RIP路由(相当于直连路由)。
路由引入的写法在其他动态路由协议中也基本如此,届时会详细举案例说明。
配置RIP发布缺省路由
在路由表中,缺省路由以到网络0.0.0.0(掩码也为0.0.0.0)的路由形式出现。当报文的目的地址不能与路由表的任何目的地址相匹配时,设备将选取缺省路由转发该报文。
操作步骤
- 执行命令system-view,进入系统视图。
- 执行命令rip [ process-id ],进入RIP视图。
- 执行命令default-route originate,将存在的缺省路由引入到RIP路由表中,并将缺省路由发送给邻居。
静默端口Silent-interface
虽然RIPv2使用组播地址进行RIP报文的发送,这减少了对非RIP设备的影响。但这些报文在对端非RIP设备的链路上占用的网络资源却没有变化。
将对端都是非RIP设备的路由器接口设置为Silent-interface接口,可以让路由器不在该接口发送RIP报文,从而减少对网络资源的占用。
操作步骤
- 执行命令system-view,进入系统视图。
- 执行命令rip [ process-id ],进入RIP视图。
- 执行命令silent-interface interface-type interface-number,禁止指定接口发送更新报文。
杂谈
本来想讲一下RIP与BFD的联动,但最终还是觉得对于过时的技术没必要花太多精力,未来还会被ospf全面替代。(最新版的华为认证考试甚至删除了RIP协议)
另外还有RIP的禁止发送/接收更新报文,修改定时器/跳数,路由过滤等配置,这部分建议看华为官网的技术文档,配置很简单的(但没有学习的意义,以后真要用了,知道会有这个东西就够了)
实际工作中,用最多的,其实是静态路由,除非专门干大型网络搭建的。
目前国内已经不是互联网的拓张建设时期了,是处于维护阶段。
可能会对单台设备进行更新,重新进行配置,但不会对整个网络架构进行大刀阔斧的改动。
学会分析案例、排除故障才是最重要的。
我认为,学习这些网络知识、协议原理、配置命令是为了做一次扫盲,去构建一个知识体系。
你不需要精通熟记,但你要能在故障排查过程中回想起这些点,再就着这些点去试探检验。